
#Область ОписаниеПеременных

#КонецОбласти

#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Не Параметры.Свойство("КонтейнерЗначения") Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	//@skip-check unknown-form-parameter-access
	ВходящееЗначениеКонтейнер = Параметры.КонтейнерЗначения;//см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияУниверсальногоЗначения
	//@skip-check unknown-form-parameter-access
	КонтекстКлиента = Параметры.КонтекстКлиента;
	//@skip-check unknown-form-parameter-access
	Выражение = Параметры.Выражение;
	
	ЗначениеКонтейнера = УИ_ОбщегоНазначенияКлиентСервер.ЗначениеИзХранилищаКонтейнераУниверсальногоЗначения(ВходящееЗначениеКонтейнер);
	ПредставлениеТипа = Строка(ТипЗнч(ЗначениеКонтейнера));
	КоличествоЭлементов = ЗначениеКонтейнера.Количество();
	Заголовок = ВходящееЗначениеКонтейнер.ОписаниеТипа.Имя;
	
	Если КоличествоЭлементов > 0 Тогда
		Попытка
			//@skip-check module-unused-local-variable
			НулевойЭлементКоллекции = ЗначениеКонтейнера[0];
//			Для Каждого ЭлементДляКжадого Из ЗначениеКонтейнера Цикл
//				Если ЭлементДляКжадого = НулевойЭлементКоллекции Тогда
			ВозможенДоступКЭлементуКоллекцииПоИндексу = Истина;
//				Иначе
//					ВозможенДоступКЭлементуКоллекцииПоИндексу = Ложь;
//				КонецЕсли;
//				
//				Прервать;
//			КонецЦикла;
		Исключение
			ВозможенДоступКЭлементуКоллекцииПоИндексу = Ложь;
		КонецПопытки;
	КонецЕсли;

	ЗаполнитьКолонкиКоллекции(ЗначениеКонтейнера);
	ЗаполнитьТаблицуКоллекии(ЗначениеКонтейнера);

	УИ_ОбщегоНазначения.УстановитьУсловноеОформлениеТаблицыЗначенийПросмотраЗначений(ЭтотОбъект,
																					 Элементы.ТаблицаКоллекции,
																					 "ТаблицаКоллекции");

КонецПроцедуры
#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

// Код процедур и функций

#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаКоллекции
&НаКлиенте
Процедура ТаблицаКоллекцииВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ДанныеСтроки = ТаблицаКоллекции.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если ДанныеСтроки = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	Если Поле.Имя = "ТаблицаКоллекцииЗначениеЕстьОшибка" И ДанныеСтроки.ЗначениеЕстьОшибка Тогда
		УИ_ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияТекста(ДанныеСтроки.ЗначениеОписаниеОшибки,
																   УИ_ОбщегоНазначенияКлиент.НовыйПустоеОписаниеОповещения(),
																   "Ошибка при обработке элемента коллекции",
																   ,
																   Истина);
	Иначе
		ПоказатьЗначениеВОтдельномОкне();
	КонецЕсли;
КонецПроцедуры
#КонецОбласти

#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ПоказатьВОтдельномОкне(Команда)
	ПоказатьЗначениеВОтдельномОкне();
КонецПроцедуры
#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ПоказатьЗначениеВОтдельномОкне()
	ТекущиеДанные = Элементы.ТаблицаКоллекции.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВидыКонтейнеров = ВидыКонтейнераЗначения();
	
	ХранилищеДляПараметровФормы = УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияУниверсальногоЗначения();
	ХранилищеДляПараметровФормы.ОписаниеТипа = ТекущиеДанные.ЗначениеТипЗначения;
	ХранилищеДляПараметровФормы.ИмяОбъектаМетаданных = ТекущиеДанные.ИмяОбъектаМетаданных;

	Если ТекущиеДанные.ВидКонтейнера = ВидыКонтейнеров.ВычислитьПоВходящемуЗначению Тогда
		ХранилищеДляПараметровФормы.ИменаСвойствДляДоступаКЗначению.Добавить(ТекущиеДанные.Индекс);
		ХранилищеДляПараметровФормы.Вид = ВходящееЗначениеКонтейнер.Вид;
		ХранилищеДляПараметровФормы.Хранилище = ВходящееЗначениеКонтейнер.Хранилище;

		Для Каждого Имя Из ВходящееЗначениеКонтейнер.ИменаСвойствДляДоступаКЗначению Цикл
			ХранилищеДляПараметровФормы.ИменаСвойствДляДоступаКЗначению.Добавить(Имя);
		КонецЦикла;

	Иначе
		ХранилищеДляПараметровФормы.Вид = ТекущиеДанные.ВидКонтейнера;
		ХранилищеДляПараметровФормы.Хранилище = ТекущиеДанные.ЗначениеКонтейнер;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ПросмотретьЗначение(ХранилищеДляПараметровФормы, ЭтотОбъект, Выражение
																						   + "["
																						   + ТекущиеДанные.Индекс
																						   + "]");
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ВидыКонтейнераЗначения() 
	Виды = УИ_ОбщегоНазначенияКлиентСервер.ВидыКонтейнераУниверсальногоЗначения();
	Виды.Вставить("ВычислитьПоВходящемуЗначению", "ВычислитьПоВходящемуЗначению");
	
	Возврат Виды;	
КонецФункции

&НаСервере
Процедура ЗаполнитьКолонкиКоллекции(ЗначениеКоллекции)
	Если ЗначениеКоллекции.Количество() =0 Тогда
		Возврат;
	КонецЕсли;
	ТипыЭлементов = Новый Соответствие;
	
	Для Каждого ТекЭл Из ЗначениеКоллекции Цикл
		ТипЭл = ТипЗнч(ТекЭл);
		Если ТипЭл = Тип("ОбъектМетаданных") Тогда
			ОписаниеТипа = УИ_ОбщегоНазначения.ОписаниеТипаОбъектаМетаданных(ТекЭл);
			Если ОписаниеТипа = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ТипЭл = ОписаниеТипа.Имя;
		КонецЕсли;
		
		Если ТипыЭлементов[ТипЭл] = Неопределено Тогда
			ТипыЭлементов.Вставить(ТипЭл, ТекЭл);
		КонецЕсли;
	КонецЦикла;	
	
	ОбщиеИменаСвойств = Неопределено;
	Для Каждого КлючЗначение Из ТипыЭлементов Цикл
		Если ТипЗнч(КлючЗначение.Значение) = Тип("ОбъектМетаданных") Тогда
			ОписаниеТипаПлатформы = УИ_ОбщегоНазначения.ОписаниеТипаОбъектаМетаданных(ТекЭл);
			ОбъектМД = КлючЗначение.Значение;
		Иначе
			ОписаниеТипаПлатформы = УИ_ТипыПлатформыКлиентСервер.ОписаниеТипаПлатформыПоТипу(КлючЗначение.Ключ);
			ОбъектМД = Метаданные.НайтиПоТипу(КлючЗначение.Ключ);
		КонецЕсли;

		Если ОписаниеТипаПлатформы = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ИменаСвойств = УИ_ОбщегоНазначения.ИменаСвойствОписанияТипаПлатформы(ОписаниеТипаПлатформы,
																			 КлючЗначение.Значение,
																			 ОбъектМД);

		Если ОбщиеИменаСвойств = Неопределено Тогда
			ОбщиеИменаСвойств = ИменаСвойств;
		Иначе
			ОбщиеИменаСвойств = УИ_ОбщегоНазначенияКлиентСервер.РазностьМассивов(ОбщиеИменаСвойств, ИменаСвойств);
		КонецЕсли;
	КонецЦикла;
	Если ОбщиеИменаСвойств <> Неопределено Тогда
		ИменаСвойствКоллекции.ЗагрузитьЗначения(ОбщиеИменаСвойств);
	КонецЕсли;

	МассивДобавляемыхРеквизитов = Новый Массив;
	Для Каждого ИмяСвойства Из ОбщиеИменаСвойств Цикл
		МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Свойство_" + ИмяСвойства, Новый ОписаниеТипов,
			"ТаблицаКоллекции", ИмяСвойства));
	КонецЦикла;
	ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

	Для Каждого ИмяСвойства Из ОбщиеИменаСвойств Цикл
		ОписаниеЭлемента = УИ_РаботаСФормами.НовыйОписаниеРеквизитаЭлемента();
		ОписаниеЭлемента.Имя = "Свойство_" + ИмяСвойства;
		ОписаниеЭлемента.РодительЭлемента = Элементы.ТаблицаКоллекции;
		ОписаниеЭлемента.ПутьКДанным = "ТаблицаКоллекции.Свойство_" + ИмяСвойства;
		ОписаниеЭлемента.СоздаватьЭлемент = Истина;
		УИ_РаботаСФормами.СоздатьЭлементПоОписанию(ЭтотОбъект, ОписаниеЭлемента);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуКоллекии(ЗначениеКоллекции)
	ИндексЭлемента = 0;
	Для Каждого ЭлементКоллекции Из ЗначениеКоллекции Цикл
		НС = ТаблицаКоллекции.Добавить();
		НС.Индекс = ИндексЭлемента;
		УИ_ОбщегоНазначенияКлиентСервер.УстановитьЗначениеВЭлементыФормыКонтейнераУниверсальногоЗначения(ЭтотОбъект,
																										 НС,
																										 ЭлементКоллекции,
																										 Не ВозможенДоступКЭлементуКоллекцииПоИндексу);

		ВидыКонтейнеров = ВидыКонтейнераЗначения();
		Если Не ЗначениеЗаполнено(НС.ВидКонтейнера) Тогда
			НС.ВидКонтейнера = ВидыКонтейнеров.ВычислитьПоВходящемуЗначению;
		КонецЕсли;

		Для Каждого ЭлСписка Из ИменаСвойствКоллекции Цикл
			Попытка
				НС["Свойство_" + ЭлСписка.Значение] = Строка(ЭлементКоллекции[ЭлСписка.Значение]);
			Исключение
				НС.ЗначениеЕстьОшибка = Истина;
				НС.ЗначениеОписаниеОшибки = НС.ЗначениеОписаниеОшибки
											+ ?(ЗначениеЗаполнено(НС.ЗначениеОписаниеОшибки), Символы.ПС, "")
											+ "Ошибка при вычислении значения свойства элемента коллекции "
											+ ОписаниеОшибки();
//				НС["Свойство_" + ЭлСписка.Значение] = ОписаниеОшибки();
			КонецПопытки;
		КонецЦикла;
		ИндексЭлемента = ИндексЭлемента + 1;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти
